概述
本文涉及的到几个重要的类:
- LauncherModel:Launcher 数据处理核心类
- LoaderTask:主要任务负责加载数据(workspace、all apps)和绑定数据(workspace、all apps)
- AutoInstallsLayout:
- InvariantDeviceProfile: 桌面的一些配置,比如默认布局文件
- BgDataModel: 用来放布局相关的集合
- WorkspaceItemInfo,FolderInfo,LauncherAppWidgetInfo:都是继承自ItemInfo,保存桌面图标的一些信息:图标位置,宽高,类型等信息
数据加载流程
1 | Launcher.onCreate |
数据加载主要在 LoaderTask.run() 中进行,这部分代码注释非常清楚,主要分为下面5个步骤:
- step 1: workspace
- step 1.1: loading workspace
- step 1.2: bind workspace
- step 1.3: send first screen broadcast
- step 1 completed, wait for idle
- step 2: all apps
- step 2.1: loading all apps
- step 2.2: Binding all apps
- step 2.3: Update icon cache
- step 2 completed, wait for idle
- step 3: deep shortcuts
- step 3.1: loading deep shortcuts
- step 3.2: bind deep shortcuts
- step 3 completed, wait for idle
- step 4: widgets
- step 4.1: loading widgets
- step 4.2: Binding widgets
- step 4.3: Update icon cache
- step 5
- step 5: Finish icon cache update
Launcher
Launcher实现了LauncherModel.Callbacks接口,用于回调界面显示更新。
1 | public interface Callbacks { |
WorkSpace
loadWorkspace
先来分析一下 LoaderTask.loadWorkspace()
的几个关键步骤。
loadWorkspace 也可以分两小步,第1小步是获取数据库,如果有数据库则直接进入第2小步,如果数据库为空则从默认xml布局文件生成数据库。第2小步,从数据库读取信息存放到 sBgDataModel
中。loadWorkspace 方法的结果就是 sBgDataModel
。
读取数据库的操作也比较简单,根据item的类别进行一些合法性的校验,如果不合法就标记删除,全部加载完毕后统计一些删除操作,保留数据库中的合法的数据。
开始分析 loadWorkspace 源码。
准备工作
1 | // LoaderTask.loadWorkspace() |
LauncherSettings.Settings.call(contentResolver,LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES)
会调用到 LauncherProvider
的 loadDefaultFavoritesIfNecessary()
方法。
这个方法来判断是否需要加载默认的布局,如果清除了桌面数据或者手机恢复了出厂设置,就会加载默认的布局。
1 | // LauncherProvider.loadDefaultFavoritesIfNecessary |
1 | // LauncherProvider.getDefaultLayoutParser |
如果不是第一次开机,那么上面的这一步时不需要进行的,直接进行下一步。
接下来继续分析 LoaderTask.loadWorkspace()
。
先来简单介绍一下 BgDataModel 这个类,用来放布局相关的集合:
- workspaceScreens是保存屏幕的
- workspaceItems是桌面的图标
- appWidgets是桌面的小部件
- Folders是文件夹
下面开始读取数据库以及对从数据库里面读取的数据进行分析。
加载数据库
1 | // LoaderTask.loadWorkspace() |
下面开始对数据库每一条数据根据类型的不同进行不同的处理。
快捷方式数据
这里的快捷方式分为三种:
- ITEM_TYPE_APPLICATION:应用图标
- ITEM_TYPE_SHORTCUT:应用创建的快捷图标
- ITEM_TYPE_DEEP_SHORTCUT:Pinned Shortcuts,长按应用图标弹出菜单,从菜单里面拖出的快捷方式。
这里会根据不同的类型生成不同的对象,保存在 BgDataModel 中。
1 | case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: |
文件夹类型数据
1 | //LoaderTask.loadWorkspace() |
桌面插件类型数据
1 | //LoaderTask.loadWorkspace() |
数据的最终处理
对数据进一步处理,如果前面标记了清除,那么这里就从数据库中进行删除对应数据。
1 | //LoaderTask.loadWorkspace() |
bindWorkspace
1 | // BaseLoaderResults.java |
最终的数据绑定和快捷图标的生成在Launcher.bindItems中:
1 | public void bindItems(final List<ItemInfo> items, final boolean forceAnimateIcons) { |
loadAllApps
加载系统中已经安装的应用